package myjdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/**
 * @Auther: cty
 * @Date: 2020/1/19 11:22
 * @Description:  JDBC访问MySQL数据库，通过【参数传递】，实现删除一条记录，
 *                但可能会出现Statement类产生的【SQL注入】问题
 * @version: 1.0
 */
public class JDBC_Demo02_Injection {

    public static final String URL = "jdbc:mysql://localhost:3306/testjdbc";
    public static final String USER = "root";
    public static final String PASSWORD = "123456";

    public static void main(String[] args) throws ClassNotFoundException, SQLException {
        //1. 加载MySQL驱动程序
        Class.forName("com.mysql.jdbc.Driver");

        //2. 获得数据库连接
        Connection conn = DriverManager.getConnection(URL,USER,PASSWORD);

        //3. 操作数据库，实现增删改查
        Statement stmt = conn.createStatement();

        //通过 参数传递（参数可能是表达式） 插入一条记录
        String id = "3 or 1=1";  //SQL注入，会清空数据表！！！——说明Statement参数传递发送SQL语句存在危险，因此只能发送不带参的简单的SQL语句
        String sql = "delete from user where id = "+id;  //边缘参数传递方式，“执行时”会传入id中的的所有内容，因此会发生SQL注入
//        System.out.println(sql);  //print: delete from user where id = 3 or 1=1
//        String sql = "delete from user where id = '"+id+"'";  //边缘或内部参数传递方式，“执行时”只能传入id中的第一个int，如"3 or 1=1"只能传入3，因此不会发生SQL注入
//        System.out.println(sql);  //print: delete from user where id = '3 or 1=1'

        int rs = stmt.executeUpdate(sql);

        //4. 处理返回数据——如果有数据，rs为更新的行数
        System.out.println("更新了"+rs+"条记录！");

        //5. 关闭连接
        if(stmt!=null){
            stmt.close();
        }
        if(conn!=null){
            conn.close();
        }
    }
}

/* res: (删除了表中所有记录)
更新了4条记录！
*/